package com.imooc.zkjavaapi;

import com.imooc.zkjavaapi.callback.DeleteCallback;
import org.apache.zookeeper.*;

import java.io.IOException;

/**
 * 连接到Zookeeper服务端，打印连接状态
 */
public class ZKOperator implements Watcher {
    public static final String SERVER_PATH = "127.0.0.1:2181";
    public static final Integer timeout = 5000;

    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        /**
         * 客户端和服务端他们是异步连接，连接成功后，客户端会收到watcher通知。
         * connectString: 服务器的IP+端口号，比如127.0.0.1:2128
         * sessionTimeout: 客户端和服务端之间的超时时间，单位毫秒
         * watcher: 监听器，当连接成功后，客户端会收到watcher通知
         */
        ZooKeeper zk = new ZooKeeper(SERVER_PATH, timeout, new ZKOperator());
        System.out.println("客户端开始连接Zookeeper服务端...");
        System.out.println("连接状态：" + zk.getState());
        Thread.sleep(2000); // 等待20秒，观察连接状态变化
        /**
         * path: 节点的路径
         * data: 节点的数据内容
         * acl: 节点的访问控制列表，这里使用OPEN_ACL_UNSAFE表示所有人都可以访问
         * createMode: 节点的创建模式，永久、临时、顺序等，这里使用PERSISTENT表示永久节点
         */
        zk.create("/imooc-create-node","imooc".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        zk.setData("/imooc-create-node", "imooc-updated".getBytes(), 0);
        byte[] data = zk.getData("/imooc-create-node", null, null);
        System.out.println(new String(data));
        String ctx  = "删除节点的上下文信息";
        zk.delete("/imooc-create-node", 1, new DeleteCallback(), ctx);
        Thread.sleep(2000); // 等待20秒，观察连接状态变化
    }


    @Override
    public void process(WatchedEvent watchedEvent) {
        System.out.println("收到通知：" + watchedEvent);
    }
}
